package cn.stylefeng.guns.modular.gridsystem.service;

import cn.stylefeng.guns.core.pojo.page.PageResult;
import cn.stylefeng.guns.modular.gridsystem.entity.BizGateway;
import cn.stylefeng.guns.modular.gridsystem.model.param.ApplicationRecordParam;
import cn.stylefeng.guns.modular.gridsystem.model.param.BizGatewayParam;
import cn.stylefeng.guns.modular.gridsystem.model.param.DirectoryTreeParam;
import cn.stylefeng.guns.modular.gridsystem.model.param.GatewayImportParam;
import cn.stylefeng.guns.modular.gridsystem.model.result.BizGatewayResult;
import cn.stylefeng.guns.modular.gridsystem.model.result.DeviceStatusNumberResult;
import cn.stylefeng.guns.modular.gridsystem.model.result.GatewayGrantInfoResult;
import cn.stylefeng.guns.modular.gridsystem.model.result.GatewayResult;
import cn.stylefeng.guns.modular.gridsystem.mqtt.result.GatewayChannelStatus;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * 采集设备 服务类
 *
 * @author 乔李莱莱
 * @since 2023/10/17
 */
public interface BizGatewayService extends IService<BizGateway> {

    /**
     * 分页查询采集设备
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    PageResult<BizGatewayResult> page(BizGatewayParam bizGatewayParam);

    /**
     * 分页查询采集设备(配置向导)
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    PageResult<BizGatewayResult> guidePage(BizGatewayParam bizGatewayParam);

    /**
     * 查询所有采集设备
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    List<GatewayResult> list(BizGatewayParam bizGatewayParam);


    /**
     * 查询所有已绑定站点的网关
     * @author 乔李莱莱
     * @since 2023/10/17
     * @author zxw
     */
    List<BizGateway> listAll(BizGatewayParam param);

    /**
     * 查询未申请授权或授权已过期的网关
     *
     * @param param 查询参数
     * @author 乔李莱莱
     * @since 2023/10/17
     * @return
     */
    List<BizGatewayResult> listNoGrant(BizGatewayParam param);

    /**
     * 添加采集设备
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void add(BizGatewayParam bizGatewayParam);

    /**
     * 添加网关
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void addGateway(BizGatewayParam param);

    /**
     * 删除采集设备
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void delete(BizGatewayParam bizGatewayParam);

    /**
     * 编辑采集设备
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void edit(BizGatewayParam bizGatewayParam);

    /**
     * 配置向导编辑网关
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void editGateway(BizGatewayParam param);

    /**
     * 查看详情采集设备
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    BizGatewayParam detail(BizGatewayParam bizGatewayParam);

    /**
     * 修改状态（字典 0正常 1停用 2删除）
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void changeStatus(BizGatewayParam bizGatewayParam);

    /**
     * 根据deviceCode获取采集设备信息
     *
     * @param deviceCode 网关编号
     * @return BizGateway 采集设备
     */
    BizGateway listByDeviceCode(String deviceCode);

    /**
     * 修改 网关运行状态(0 离线 1在线）
     * 修改 网关状态(开启，禁用）
     * @author 乔李莱莱
     * @since 2023/10/17
     * @param deviceCode
     */
    void editByGatewayCode(String deviceCode);


    /**
     * 根据网关编号获取采集设备信息
     * @param bizGatewayParam
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    BizGateway gatewayByGatewayCode(BizGatewayParam bizGatewayParam);

    /**
     * 查询设备
     * @param queryWrapper
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    List<BizGatewayResult> getListAndChannel(LambdaQueryWrapper<BizGateway> queryWrapper);

    /**
     * 获取网关和通道状态信息
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    List<GatewayChannelStatus> getGatewayChannelStatus();

    /**
     * 采集设备_修改数据上报开关
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void changeSwitch(BizGatewayParam bizGatewayParam);

    /**
     * 批量操作数据上报开关
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void batchChangeDataReportStatus(BizGatewayParam param);

    /**
     * 无站点采集设备_分页查询
     * @param bizGatewayParam
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    PageResult<BizGateway> initGatewayPage(BizGatewayParam bizGatewayParam);

    /**
     * 查询配置参数
     *
     * @param param 查询参数
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    Map<String, Object> getConfig(BizGatewayParam param);

    /**
     * 更新配置参数
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void updateConfig(Map<String, Object> cfg);

    /**
     * 导入网关
     *
     * @param param
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    String importGateway(GatewayImportParam param);

    /**
     * 查询授权信息
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    GatewayGrantInfoResult queryGrantInfo();

    /**
     * 周步网关授权状态
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void syncGatewayGrant();

    /**
     * 批量添加设备申请
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void batchAddApplicationRecord(ApplicationRecordParam param);

    /**
     * 查询设备在线离线数量
     * @param stationId
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    DeviceStatusNumberResult getDeviceOnlineNumber(Integer stationId);

    /**
     * 获取网关列表树型结构
     * @param param
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    List<DirectoryTreeParam> tree(BizGatewayParam param);

    /**
     * 自检
     * @param ip
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    String test(String ip);

    /**
     * 查询网关列表
     * @param stationId
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    Map<String, Object> getAllListByStationId(Integer stationId);
}
